/**
 * 游戏下载处理器
 */

import BaseDownloadHandler from './BaseDownloadHandler.js'
import DownloadCore from './DownloadCore.js'
import GameDownloadHistory from '../GameDownloadHistory.js'
import ChatHistory from '../ChatHistory.js'

class GameDownloadHandler extends BaseDownloadHandler {
  
  /**
   * 获取游戏名称
   * @param {Object} game 游戏对象
   * @returns {string} 游戏名称
   */
  static getItemName(game) {
    if (game.name && game.name.trim() !== '') {
      return game.name
    }
    
    if (game.id) {
      return `游戏 #${game.id}`
    }
    
    try {
      const url = game.publicUrl || game.lanUrl
      if (url) {
        const urlObj = new URL(url)
        const pathParts = urlObj.pathname.split('/')
        const filename = pathParts[pathParts.length - 1]
        if (filename && filename !== '') {
          const nameWithoutExt = filename.split('.')[0]
          return nameWithoutExt || '未知游戏'
        }
      }
    } catch (e) {
      console.log('无法从 URL 提取游戏名称')
    }
    
    return '未知游戏'
  }
  
  /**
   * 获取游戏类型
   * @param {Object} game 游戏对象
   * @returns {string} 游戏类型
   */
  static getItemType(game) {
    return game.type ? game.type.toLowerCase() : 'other'
  }
  
  /**
   * 获取显示名称
   * @param {Object} game 游戏对象
   * @returns {string} 显示名称
   */
  static getDisplayName(game) {
    const gameName = this.getItemName(game)
    const gameTypeDisplay = this.getGameTypeDisplay(game.type)
    return game.type ? `${gameName} (${gameTypeDisplay})` : gameName
  }
  
  /**
   * 获取下载选项
   * @param {Object} game 游戏对象
   * @returns {Array} 下载选项列表
   */
  static getDownloadOptions(game) {
    const options = []
    
    if (game.publicUrl) {
      options.push({
        label: '公网下载',
        url: game.publicUrl,
        type: '公网下载'
      })
    }
    
    if (game.lanUrl) {
      options.push({
        label: '局域网下载',
        url: game.lanUrl,
        type: '局域网下载'
      })
    }
    
    return options
  }
  
  /**
   * 获取分类名称
   * @returns {string} 分类名称
   */
  static getCategory() {
    return '游戏'
  }
  
  /**
   * 开始下载
   * @param {Object} game 游戏对象
   * @param {string} downloadUrl 下载链接
   * @param {string} targetDir 目标目录
   */
  static startDownload(game, downloadUrl, targetDir) {
    const itemName = this.getItemName(game)
    const gameType = this.getItemType(game)
    
    // 使用下载核心模块处理下载
    DownloadCore.startDownload({
      item: game,
      itemName: itemName,
      itemType: gameType,
      downloadUrl: downloadUrl,
      targetDir: targetDir,
      category: 'game',
      historyHandler: GameDownloadHistory,
      getDirectory: this.getGameDirectory.bind(this),
      getDefaultExtension: this.getDefaultExtension.bind(this)
    })
  }
  
  /**
   * 获取游戏类型显示
   * @param {string} type 游戏类型
   * @returns {string} 游戏类型显示名称
   */
  static getGameTypeDisplay(type) {
    if (!type) return ''
    
    const gameTypes = {
      'gba': 'GBA游戏',
      'psp': 'PSP游戏', 
      'exe': 'PC游戏',
      'apk': 'Android游戏',
      'ipa': 'iOS游戏',
      'nds': 'NDS游戏',
      'ps1': 'PS1游戏',
      'ps2': 'PS2游戏',
      'n64': 'N64游戏',
      'snes': 'SNES游戏',
      'nes': 'FC游戏',
      'gbc': 'GBC游戏',
      'gb': 'GB游戏',
      'md': 'MD游戏',
      'arcade': '街机游戏',
      'steam': 'Steam游戏',
      'switch': 'Switch游戏',
      'ps3': 'PS3游戏',
      'ps4': 'PS4游戏',
      'ps5': 'PS5游戏',
      'xbox': 'Xbox游戏',
      'wii': 'Wii游戏',
      '3ds': '3DS游戏'
    }
    
    return gameTypes[type.toLowerCase()] || type.toUpperCase()
  }
  
  /**
   * 获取默认文件扩展名
   * @param {string} gameType 游戏类型
   * @returns {string} 默认扩展名
   */
  static getDefaultExtension(gameType) {
    const extensions = {
      'gba': '.gba',
      'psp': '.iso',
      'exe': '.exe',
      'apk': '.apk',
      'ipa': '.ipa',
      'nds': '.nds',
      'ps1': '.bin',
      'ps2': '.iso',
      'n64': '.n64',
      'snes': '.smc',
      'nes': '.nes',
      'gbc': '.gbc',
      'gb': '.gb',
      'md': '.md'
    }
    return extensions[gameType] || '.zip'
  }
  
  /**
   * 获取游戏存储目录
   * @param {string} gameType 游戏类型
   * @returns {string} 目录路径
   */
  static getGameDirectory(gameType) {
    // 为Android 10+使用Download目录作为基础路径
    // 所有游戏文件都下载到 Download/RuoyiApp/games 目录下，并根据游戏类型创建子目录
    const baseDir = '/RuoyiApp/games'
    console.log('gameType==========',gameType);
    // 根据游戏类型创建子目录
    const typeDirs = {
      'gba': `${baseDir}/GBA`,
      'psp': `${baseDir}/PSP`,
      'exe': `${baseDir}/PC`,
      'apk': `${baseDir}/Android`,
      'ipa': `${baseDir}/iOS`,
      'nds': `${baseDir}/NDS`,
      'ps1': `${baseDir}/PlayStation1`,
      'ps2': `${baseDir}/PlayStation2`,
      'ps3': `${baseDir}/PlayStation3`,
      'ps4': `${baseDir}/PlayStation4`,
      'ps5': `${baseDir}/PlayStation5`,
      'xbox': `${baseDir}/Xbox`,
      'wii': `${baseDir}/Wii`,
      'switch': `${baseDir}/Switch`,
      'n64': `${baseDir}/Nintendo64`,
      'snes': `${baseDir}/SNES`,
      'nes': `${baseDir}/NES`,
      'gbc': `${baseDir}/GameBoyColor`,
      'gb': `${baseDir}/GameBoy`,
      'md': `${baseDir}/MegaDrive`,
      'arcade': `${baseDir}/Arcade`,
      'steam': `${baseDir}/Steam`,
      '3ds': `${baseDir}/3DS`
    }
    
    const dir = typeDirs[gameType] || `${baseDir}/Other`;
    console.log('游戏目录:', dir, '游戏类型:', gameType);
    return dir;
  }
  
  /**
   * 获取游戏文件所在目录
   * @param {string} gameType 游戏类型
   * @param {string} filePath 文件路径
   * @returns {string} 目录路径
   */
  static getGameFileDirectory(gameType, filePath) {
    // 如果有文件路径，则返回文件所在的目录
    if (filePath) {
      // 获取文件路径中的目录部分
      const lastSlashIndex = filePath.lastIndexOf('/')
      if (lastSlashIndex > 0) {
        return filePath.substring(0, lastSlashIndex)
      }
    }
    
    // 否则返回默认的游戏目录
    return this.getGameDirectory(gameType)
  }
}

export default GameDownloadHandler